<?php
namespace App\Http\Helpers;

trait Functions
{
    /**
     * 返回规定json格式
     * @param $int //成功返回0, 失败返回错误码
     * @param $message //信息
     * @param $data //参数
     * @param string $jump //跳转地址
     */
    function returnData($code = 200, $message = '', $data = [], $jump = '')
    {
        header('Content-Type:application/json; charset=utf-8');
        return json_encode([
            'code' => $code,
            'message' => $message,
            'data' => $data,
            'jump' => $jump,
        ], JSON_UNESCAPED_UNICODE);
    }

    /**
     *    生成订单号
     *
     * @return    string
     * @author    Garbin
     */

    function gen_order_sn()
    {
        mt_srand((double)microtime() * 1000000);
        $timestamp = time();
        list($msec, $sec) = explode(' ', microtime());
        $y = date('ymdHis', $timestamp);
        $h = str_pad((float)sprintf('%.0f', (floatval($msec)) * 1000), 3, "0", STR_PAD_LEFT);
        $order_sn = $y . $h . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
        return $order_sn;
    }


//生成毫秒级时间戳
    function msectime()
    {
        list($msec, $sec) = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
    }

//生成指定长度随机字符串
    function get_rand($len = 6)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        mt_srand(10000000 * (double)microtime());
        for ($i = 0, $str = '', $lc = strlen($chars) - 1; $i < $len; $i++) {
            $str .= $chars[mt_rand(0, $lc)];
        }
        return $str;
    }

//利用正则表达式实现手机号码中间4位用星号（*）替换显示
    function hidtel($phone)
    {
        $IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i', $phone); //固定电话
        if ($IsWhat == 1) {
            return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i', '$1****$2', $phone);
        } else {
            return preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i', '$1****$2', $phone);
        }
    }

//正则验证手机号 正确返回 true
    function preg_mobile($mobile)
    {
        if (preg_match("/^1[34578]\d{9}$/", $mobile)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证电话号码
    function preg_tel($tel)
    {
        if (preg_match("/^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$/", $tel)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证身份证号（15位或18位数字）
    function preg_idcard($idcard)
    {
        if (preg_match("/^\d{15}|\d{18}$/", $idcard)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证是否是数字(这里小数点会认为是字符)
    function preg_digit($digit)
    {
        if (preg_match("/^\d*$/", $digit)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证是否是数字(可带小数点的数字)
    function preg_num($num)
    {
        if (is_numeric($num)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证由数字、26个英文字母或者下划线组成的字符串
    function preg_str($str)
    {
        if (preg_match("/^\w+$/", $str)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证用户密码(以字母开头，长度在6-18之间，只能包含字符、数字和下划线)
    function preg_password($str)
    {
        if (preg_match("/^[a-zA-Z]\w{5,17}$/", $str)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证汉字
    function preg_chinese($str)
    {
        if (preg_match("/^[\u4e00-\u9fa5],{0,}$/", $str)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证Email地址
    function preg_email($email)
    {
        if (preg_match("/^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/", $email)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证网址URL
    function preg_link($url)
    {
        if (preg_match("/http:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is", $url)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//腾讯QQ号
    function preg_qq($qq)
    {
        if (preg_match("/^[1-9][0-9]{4,}$/", $qq)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证中国邮政编码 6位数字
    function preg_post($post)
    {
        if (preg_match("/^[1-9]\d{5}(?!\d)$/", $post)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

//验证IP地址
    function preg_ip($ip)
    {
        if (preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $ip)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    /**
     * 格式化金额
     * @param $int $price
     */
    function price_format($price)
    {
        if (empty($price)) {
            $price = '0.00';
        }
        $price = number_format($price, 2, '.', '');
        return $price;
    }

    /**
     * 获取资源的目录树结构
     * @param array $arr 分类数组
     * @param int $pid children名
     * @return array|null  返回构造好的数组
     */
    function getCatalogTree($arr, $children = 'children')
    {
        //以主键ID为下标重构数组
        foreach ($arr as $k => $v) {
            $arrs[$v['id']] = $v;
        }
        $tree = array(); //格式化好的树
        foreach ($arrs as $arrss) {
            if (isset($arrs[$arrss['parent_id']])) {
                $arrs[$arrss['parent_id']][$children][] = &$arrs[$arrss['id']];
            } else {
                $tree[] = &$arrs[$arrss['id']];
            }
        }
        return $tree;
    }

    /**
     * 计算两点之间的球面距离
     * return 距离 单位(km)
     */
    function getDistance($lng1, $lat1, $lng2, $lat2)
    {
        $r = 6378.137;
        $dlat = deg2rad($lat2 - $lat1);
        $dlng = deg2rad($lng2 - $lng1);
        $a = pow(sin($dlat / 2), 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * pow(sin($dlng / 2), 2);
        $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
        $s = $r * $c;
        return round($s, 2);
    }


    /**
     * curl POST 发送POST请求
     * @param string //url
     * @param array //数据
     * @param type //1为需要转gbk,默认不转
     * @return  string
     */
    function curlPost($url, $post_data = [], $type = 0)
    {
        //初始化
        $ch = curl_init();
        //设置抓取的url
        curl_setopt($ch, CURLOPT_URL, $url);
        //设置头文件的信息作为数据流输出
        //curl_setopt($ch, CURLOPT_HEADER, 1);
        //设置获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //设置post方式提交
        curl_setopt($ch, CURLOPT_POST, 1);
        //设置post数据
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        //执行命令
        $result = curl_exec($ch);
        //关闭URL请求
        curl_close($ch);
        //显示获得的数据
        if ($type) {
            $result = iconv("gbk//IGNORE", "utf-8", $result);
        }
        return $result;
    }

    /**
     * curlGet
     * @param $url
     * @param array $header
     * @return mixed
     */
    function curlGet($url, $header = [])
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //如果把这行注释掉的话，就会直接输出
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

//搜索和高亮字符串中的关键字
//$string = "I like chocolates and I like apples";
//$words = "apple";
//echo highlighter_text($string ,$words);
    function highlighter_text($text, $words)
    {
        $split_words = explode(" ", $words);
        foreach ($split_words as $word) {
            $color = "#4285F4";
            $text = preg_replace("|($word)|Ui",
                "<span style=\"color:" . $color . ";\"><b>$1</b></span>", $text);
        }
        return $text;
    }

    /**
     * @param $dir 路径
     * @param $file_path 文件名
     * @param $contents 内容
     */
    function put_contents($dir, $file_path, $contents)
    {
        if (is_writable($dir)) {
            file_put_contents($file_path, $contents);
        } else {
            die("Directory $dir is not writable, or does not exist. Please check");
        }

    }

    /**
     * 日期转换成几分钟前
     */
    function formatTime($date)
    {
        $timer = strtotime($date);
        $diff = $_SERVER['REQUEST_TIME'] - $timer;
        $day = floor($diff / 86400);
        $free = $diff % 86400;
        if ($day > 0) {
            if (15 < $day && $day < 30) {
                return "半个月前";
            } elseif (30 <= $day && $day < 90) {
                return "1个月前";
            } elseif (90 <= $day && $day < 187) {
                return "3个月前";
            } elseif (187 <= $day && $day < 365) {
                return "半年前";
            } elseif (365 <= $day) {
                return "1年前";
            } else {
                return $day . "天前";
            }
        } else {
            if ($free > 0) {
                $hour = floor($free / 3600);
                $free = $free % 3600;
                if ($hour > 0) {
                    return $hour . "小时前";
                } else {
                    if ($free > 0) {
                        $min = floor($free / 60);
                        $free = $free % 60;
                        if ($min > 0) {
                            return $min . "分钟前";
                        } else {
                            if ($free > 0) {
                                return $free . "秒前";
                            } else {
                                return '刚刚';
                            }
                        }
                    } else {
                        return '刚刚';
                    }
                }
            } else {
                return '刚刚';
            }
        }
    }

    /**
     *对内容中的关键词添加链接
     *只处理第一次出现的关键词，对已有链接的关键不会再加链接，支持中英文
     *$content:string 原字符串
     *$keyword:string  关键词
     *$link:string,链接
     */
    function yang_keyword_link($content, $keyword, $link)
    {
        //排除图片中的关键词
        $content = preg_replace('|(<img[^>]*?)(' . $keyword . ')([^>]*?>)|U', '$1%&&&&&%$3', $content);
        $regEx = '/(?!((<.*?)|(<a.*?)))(' . $keyword . ')(?!(([^<>]*?)>)|([^>]*?<\/a>))/si';
        $url = '<a href="' . $link . '" target="_blank" class="content_guanjianci">' . $keyword . '</a>';
        $content = preg_replace($regEx, $url, $content, 1);
        //还原图片中的关键词
        $content = str_replace('%&&&&&%', $keyword, $content);
        return $content;
    }

}
